package com.huajin.codetest.lock.lock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;

/**
 * Lock
 * 全限定类名：java.util.concurrent.locks.Lock
 * JDK1.5
 */
public interface LockSource {
	
	/**
	 * 用来获取锁，如果锁已被其他线程获取，则进行等待
	 */
	void lock();
	
	/**
	 * 获取锁，如果获取锁失败则进行等到，如果等待的线程被中断会相应中断信息
	 */
	void lockInterruptibly() throws InterruptedException;
	
	/**
	 * 表示用来尝试获取锁，如果获取成功，则返回true，如果获取失败（即锁已被其他线程获取），则返回false，
	 * 也就说这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待
	 */
	boolean tryLock();
	
	/**
	 * 和tryLock()类似，区别在于它在拿不到锁时会等待一定的时间，在时间期限之内如果还拿不到锁，就返回false。
	 * 如果如果一开始拿到锁或者在等待期间内拿到了锁，则返回true
	 */
	boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
	
	/**
	 * 释放锁的操作
	 */
	void unlock();
	
	/**
	 * 获取Condition对象，该组件和当前的锁绑定，当前线程只有获得了锁，才能调用该组件wait()方法，而调用后，当前线程释放锁
	 */
	Condition newCondition();
	
}
